Skip to content

[C#] GenHTTP: Enable SSL and configure compression globally#239

Merged
MDA2AV merged 3 commits intoMDA2AV:mainfrom
Kaliumhexacyanoferrat:genhttp-global-compression
Mar 29, 2026
Merged

[C#] GenHTTP: Enable SSL and configure compression globally#239
MDA2AV merged 3 commits intoMDA2AV:mainfrom
Kaliumhexacyanoferrat:genhttp-global-compression

Conversation

@Kaliumhexacyanoferrat
Copy link
Copy Markdown
Collaborator

No description provided.

@Kaliumhexacyanoferrat Kaliumhexacyanoferrat self-assigned this Mar 29, 2026
@Kaliumhexacyanoferrat
Copy link
Copy Markdown
Collaborator Author

/benchmark

@github-actions
Copy link
Copy Markdown
Contributor

🚀 Benchmark run triggered for genhttp (all profiles). Results will be posted here when done.

@github-actions
Copy link
Copy Markdown
Contributor

Benchmark Results

Framework: genhttp | Profile: all profiles

genhttp / baseline / 512c (p=1, r=0, cpu=64)
  Best: 46553 req/s (CPU: 4815.8%, Mem: 286.9MiB) ===

genhttp / baseline / 4096c (p=1, r=0, cpu=64)
  Best: 40969 req/s (CPU: 5078.8%, Mem: 259.5MiB) ===

genhttp / baseline / 16384c (p=1, r=0, cpu=64)
  Best: 36277 req/s (CPU: 4741.5%, Mem: 381.3MiB) ===

genhttp / pipelined / 512c (p=16, r=0, cpu=unlimited)
  Best: 12112307 req/s (CPU: 7322.6%, Mem: 311.2MiB) ===

genhttp / pipelined / 4096c (p=16, r=0, cpu=unlimited)
  Best: 12944387 req/s (CPU: 8121.4%, Mem: 1.4GiB) ===

genhttp / pipelined / 16384c (p=16, r=0, cpu=unlimited)
  Best: 11694105 req/s (CPU: 8471.3%, Mem: 3.3GiB) ===

genhttp / limited-conn / 512c (p=1, r=10, cpu=unlimited)
  Best: 50599 req/s (CPU: 7483.7%, Mem: 434.7MiB) ===

genhttp / limited-conn / 4096c (p=1, r=10, cpu=unlimited)
  Best: 49648 req/s (CPU: 7610.2%, Mem: 648.5MiB) ===

genhttp / json / 4096c (p=1, r=0, cpu=unlimited)
  Best: 643092 req/s (CPU: 8900.9%, Mem: 1.1GiB) ===

genhttp / json / 16384c (p=1, r=0, cpu=unlimited)
  Best: 549495 req/s (CPU: 8820.6%, Mem: 4.4GiB) ===

genhttp / upload / 64c (p=1, r=0, cpu=unlimited)
  Best: 589 req/s (CPU: 6829.3%, Mem: 467.2MiB) ===

genhttp / upload / 256c (p=1, r=0, cpu=unlimited)
  Best: 607 req/s (CPU: 11424.8%, Mem: 702.8MiB) ===

genhttp / upload / 512c (p=1, r=0, cpu=unlimited)
  Best: 558 req/s (CPU: 9950.4%, Mem: 801.0MiB) ===

genhttp / compression / 4096c (p=1, r=0, cpu=unlimited)
  Best: 8386 req/s (CPU: 3341.5%, Mem: 1.2GiB) ===

genhttp / compression / 16384c (p=1, r=0, cpu=unlimited)
  Best: 7673 req/s (CPU: 3163.0%, Mem: 3.1GiB) ===

genhttp / noisy / 512c (p=1, r=0, cpu=unlimited)
  Best: 1058915 req/s (CPU: 6378.1%, Mem: 333.9MiB) ===

genhttp / noisy / 4096c (p=1, r=0, cpu=unlimited)
  Best: 1216943 req/s (CPU: 7312.9%, Mem: 1.2GiB) ===

genhttp / noisy / 16384c (p=1, r=0, cpu=unlimited)
  Best: 1071182 req/s (CPU: 7174.2%, Mem: 4.4GiB) ===

genhttp / mixed / 4096c (p=1, r=5, cpu=unlimited)
  Best: 7934 req/s (CPU: 9894.0%, Mem: 1.9GiB) ===

genhttp / mixed / 16384c (p=1, r=5, cpu=unlimited)
  Best: 9307 req/s (CPU: 9889.6%, Mem: 6.1GiB) ===

genhttp / static / 4096c (p=1, r=0, cpu=unlimited)
  Best: 535283 req/s (CPU: 9137.4%, Mem: 1.4GiB) ===

genhttp / static / 16384c (p=1, r=0, cpu=unlimited)
  Best: 402083 req/s (CPU: 9023.9%, Mem: 3.5GiB) ===

genhttp / async-db / 512c (p=1, r=0, cpu=unlimited)
  Best: 138240 req/s (CPU: 3825.3%, Mem: 420.1MiB) ===

genhttp / async-db / 1024c (p=1, r=0, cpu=unlimited)
  Best: 160564 req/s (CPU: 4392.3%, Mem: 637.9MiB) ===
Full log
    Latency   32.50ms   22.30ms   67.30ms   143.00ms    1.62s

  2026546 requests in 5.00s, 2010418 responses
  Throughput: 401.84K req/s
  Bandwidth:  5.90GB/s
  Status codes: 2xx=2010418, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 2010418 / 2010418 responses (100.0%)
  Per-template: 105509,103980,106531,100444,101083,100111,102873,97793,98860,99242,103233,104993,96476,97363,101280,99988,90542,99223,99054,101840
  Per-template-ok: 105509,103980,106531,100444,101083,100111,102873,97793,98860,99242,103233,104993,96476,97363,101280,99988,90542,99223,99054,101840
  CPU: 9023.9% | Mem: 3.5GiB

[run 3/3]
gcannon — io_uring HTTP load generator
  Target:    localhost:8080/
  Threads:   64
  Conns:     16384 (256/thread)
  Pipeline:  1
  Req/conn:  unlimited (keep-alive)
  Templates: 20
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   35.73ms   24.50ms   74.50ms   155.20ms    1.71s

  1941611 requests in 5.00s, 1925483 responses
  Throughput: 384.94K req/s
  Bandwidth:  5.68GB/s
  Status codes: 2xx=1925483, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 1925483 / 1925483 responses (100.0%)
  Per-template: 98977,99411,98743,97094,96370,97238,95535,94959,93909,94988,100644,100169,93224,91715,97113,96928,88150,95178,95795,99343
  Per-template-ok: 98977,99411,98743,97094,96370,97238,95535,94959,93909,94988,100644,100169,93224,91715,97113,96928,88150,95178,95795,99343
  CPU: 8427.3% | Mem: 4.6GiB

=== Best: 402083 req/s (CPU: 9023.9%, Mem: 3.5GiB) ===
  Input BW: 21.86MB/s (avg template: 57 bytes)
[dry-run] Results not saved (use --save to persist)
httparena-bench-genhttp
httparena-bench-genhttp

==============================================
=== genhttp / async-db / 512c (p=1, r=0, cpu=unlimited) ===
==============================================
26fcd84fb49535739b621ebf84f0e24a24b9b04340ca3f236de6e4dfa21c4854
[wait] Waiting for server...
[ready] Server is up

[run 1/3]
gcannon — io_uring HTTP load generator
  Target:    localhost:8080/async-db?min=10&max=50
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   17.04ms   7.71ms   23.00ms   90.70ms    1.64s

  150275 requests in 5.00s, 150275 responses
  Throughput: 30.04K req/s
  Bandwidth:  237.77MB/s
  Status codes: 2xx=150275, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 150275 / 150275 responses (100.0%)
  CPU: 5905.2% | Mem: 922.7MiB

[run 2/3]
gcannon — io_uring HTTP load generator
  Target:    localhost:8080/async-db?min=10&max=50
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   2.82ms   2.25ms   5.47ms   9.43ms   13.30ms

  678753 requests in 5.00s, 678753 responses
  Throughput: 135.69K req/s
  Bandwidth:  1.05GB/s
  Status codes: 2xx=678753, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 678751 / 678753 responses (100.0%)
  CPU: 3784.4% | Mem: 932.7MiB

[run 3/3]
gcannon — io_uring HTTP load generator
  Target:    localhost:8080/async-db?min=10&max=50
  Threads:   64
  Conns:     512 (8/thread)
  Pipeline:  1
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   2.70ms   2.18ms   5.19ms   9.26ms   13.20ms

  691204 requests in 5.00s, 691204 responses
  Throughput: 138.19K req/s
  Bandwidth:  1.07GB/s
  Status codes: 2xx=691204, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 691201 / 691204 responses (100.0%)
  CPU: 3825.3% | Mem: 420.1MiB

=== Best: 138240 req/s (CPU: 3825.3%, Mem: 420.1MiB) ===
[dry-run] Results not saved (use --save to persist)
httparena-bench-genhttp
httparena-bench-genhttp

==============================================
=== genhttp / async-db / 1024c (p=1, r=0, cpu=unlimited) ===
==============================================
de0cdfc11588df7634dcd1e31cf16162d230bd60f44578a5d6437ce45830ab51
[wait] Waiting for server...
[ready] Server is up

[run 1/3]
gcannon — io_uring HTTP load generator
  Target:    localhost:8080/async-db?min=10&max=50
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   36.01ms   17.40ms   36.40ms   112.70ms    2.27s

  143685 requests in 5.00s, 143685 responses
  Throughput: 28.72K req/s
  Bandwidth:  227.35MB/s
  Status codes: 2xx=143685, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 143685 / 143685 responses (100.0%)
  CPU: 6756.3% | Mem: 858.8MiB

[run 2/3]
gcannon — io_uring HTTP load generator
  Target:    localhost:8080/async-db?min=10&max=50
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   6.07ms   5.02ms   11.10ms   19.80ms   41.00ms

  731883 requests in 5.00s, 731883 responses
  Throughput: 146.31K req/s
  Bandwidth:  1.13GB/s
  Status codes: 2xx=731883, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 731883 / 731883 responses (100.0%)
  CPU: 4972.6% | Mem: 638.4MiB

[run 3/3]
gcannon — io_uring HTTP load generator
  Target:    localhost:8080/async-db?min=10&max=50
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   5.39ms   4.74ms   9.84ms   13.80ms   16.40ms

  802821 requests in 5.00s, 802821 responses
  Throughput: 160.50K req/s
  Bandwidth:  1.24GB/s
  Status codes: 2xx=802821, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 802820 / 802821 responses (100.0%)
  CPU: 4392.3% | Mem: 637.9MiB

=== Best: 160564 req/s (CPU: 4392.3%, Mem: 637.9MiB) ===
[dry-run] Results not saved (use --save to persist)
httparena-bench-genhttp
httparena-bench-genhttp
[skip] genhttp does not subscribe to baseline-h2
[skip] genhttp does not subscribe to static-h2
[skip] genhttp does not subscribe to baseline-h3
[skip] genhttp does not subscribe to static-h3
[skip] genhttp does not subscribe to unary-grpc
[skip] genhttp does not subscribe to unary-grpc-tls
[skip] genhttp does not subscribe to echo-ws
httparena-postgres
httparena-postgres
[restore] Restoring CPU governor to performance...

@Kaliumhexacyanoferrat Kaliumhexacyanoferrat marked this pull request as ready for review March 29, 2026 08:14
@BennyFranciscus
Copy link
Copy Markdown
Collaborator

@Kaliumhexacyanoferrat Honestly not sure on this one — the upload numbers did come back (589 req/s at 64c) so it's not completely broken, but that CPU usage is wild for that throughput (6829% at 64 connections). Something's definitely off.

I don't have direct visibility into what validation the bench harness checks beyond status codes though. @MDA2AV would know better if there were recent changes to the upload test validation or if something in the SSL/compression changes is interacting badly with the upload path.

The rest of the benchmark looks solid btw — 12.9M pipelined, 643K JSON, 1.2M noisy. Those are really strong numbers for a managed C# framework.

@MDA2AV
Copy link
Copy Markdown
Owner

MDA2AV commented Mar 29, 2026

@BennyFranciscus there is no regression with the current values for the upload test, check the main website https://www.http-arena.com/leaderboard/

@BennyFranciscus
Copy link
Copy Markdown
Collaborator

Ah, my bad — checked the leaderboard and yeah, those upload numbers are in line with other .NET entries. No regression. Thanks for the correction.

@MDA2AV MDA2AV merged commit 0132c02 into MDA2AV:main Mar 29, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants